part of api_widget;

/// 提供数据的抽象
// ignore: constant_identifier_names
enum ApiWidgetType { BUTTON, SWITCH, SLIDING, INFO }

//*********************  api和api组件信息集合 ********************************/
/// 记录组件的API信息和一些状态信息。
///
class ApiWidgetInfo {
  late String id; // 在加入组别后自动赋值
  ApiWidgetType type; // 类别
  APIInfo apiInfo; // api信息
  String? control; // 控制参数

  List<dynamic> options; // 请求选项
  List<dynamic> response; // 响应信息
  List<dynamic> responseAlias; // 响应别名
  Map<String, dynamic>? state; // 记录状态信息，都存储在'0'中。有待优化 // FIXME

  ApiWidgetInfo({
    this.type = ApiWidgetType.BUTTON,
    required this.apiInfo,
    this.control,
    this.options = const [0, 0, 0],
    this.response = const ['', '', ''],
    this.responseAlias = const ['', '', ''],
  }) {
    id = DateTime.now().millisecondsSinceEpoch.toString();
  }

  // 序列化,便于数据的读取和写出
  ApiWidgetInfo.fromJson(Map<String, dynamic> json)
      : type = ApiWidgetType.values[json['type']],
        id = json['id'],
        state = json['state'],
        apiInfo = APIInfo.fromJson(json['apiInfo']),
        control = json['control'],
        options = json['options'],
        response = json['response'],
        responseAlias = json['responseAlias'];

  Map<String, dynamic> toJson() => {
        'id': id,
        'type': type.index,
        'state': state,
        'apiInfo': apiInfo,
        'control': control,
        'options': options,
        'response': response,
        'responseAlias': responseAlias,
      };

  @override
  String toString() {
    return toJson().toString();
  }

  //FIXME 根据类型生成控制, 代码略显冗余
  Map<String, dynamic>? genParam(dynamic state) {
    if (state == null) return {};
    switch (type) {
      case ApiWidgetType.BUTTON: // 按键
        break;
      case ApiWidgetType.SWITCH: // 开关
        int index = state ? 0 : 1;
        if (control == null) break;
        return {control ?? "": options[index]};
      case ApiWidgetType.SLIDING: // 滑动
        if (control == null) return {};
        return {control ?? "": state.toStringAsFixed(3)};
      case ApiWidgetType.INFO: // 信息
        break;
    }
    return {};
  }

  // 发送api请求
  Future<Response?> action({
    required String url,
    Map<String, dynamic>? params,
    Map<String, dynamic>? headers,
  }) async {
    API api = API(url, params: apiInfo.params, headers: apiInfo.headers); // 默认参数
    api.setParams(params); // 设置自定义参数
    api.setParams(headers); // 设置自定义头部
    Response? res = await api.send(apiInfo.method, apiInfo.path);
    return res;
  }
}
